home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / emulator / bsvc-1.000 / bsvc-1 / bsvc-1.0.4 / src / SimHector / cpu / DataPath.hxx < prev    next >
Text File  |  1995-07-26  |  4KB  |  134 lines

  1. ///////////////////////////////////////////////////////////////////////////////
  2. //
  3. // DataPath.hxx - Data Path for the Hector 1600 CPU
  4. //
  5. // By: Bradford W. Mott
  6. // December 3,1993
  7. //
  8. ///////////////////////////////////////////////////////////////////////////////
  9.  
  10. #ifndef DATAPATH_HXX
  11. #define DATAPATH_HXX
  12.  
  13. #include "BasicCPU.hxx"
  14. #include "ALU.hxx"
  15. #include "RegisterSet.hxx"
  16.  
  17. enum DataPathBus { NONE, A_BUS, B_BUS, ALU_BUS };
  18.  
  19. ///////////////////////////////////////////////////////////////////////////////
  20. // The Data Path for the Hector 1600 CPU
  21. ///////////////////////////////////////////////////////////////////////////////
  22. class DataPath {
  23.   private:
  24.     BasicCPU*    cpu;               // Pointer to the CPU
  25.  
  26.     int          A_SEL;             // A BUS Register Select
  27.     int          B_SEL;             // B BUS Register Select
  28.     unsigned int WRT_A;             // Write Register A
  29.     unsigned int WRT_B;             // Write Register B
  30.     unsigned int DB_GT;             // Data Bus Gate
  31.     unsigned int ALU_GT;            // ALU Bus Gate
  32.     ALUFunction  ALU_FN;            // ALU Function Select
  33.     DataPathBus  MDR_SEL;           // Mux value for Memory Data Register
  34.     unsigned int MDR_LATCH;         // Memory Data Register Latch
  35.     unsigned int MDR_OUT_EN;        // Memory Data Register Output Enable
  36.     unsigned int MAR_LATCH;         // Memory Address Register Latch
  37.     unsigned int MAR_OUT_EN;        // Memory Address Register Output Enable
  38.     DataPathBus  MAR_SEL;           // Mux value for Memory Address Register
  39.     unsigned int IR_LATCH;          // Instruction Register Latch
  40.  
  41.     unsigned int a_bus;             // Value on the A Bus
  42.     unsigned int b_bus;             // Value on the B Bus
  43.     unsigned int alu_bus;           // Value on the ALU Bus
  44.     unsigned int data_bus;          // Value on the Data Bus
  45.     unsigned int wrt_bus;           // Value on the Write Bus
  46.  
  47.     unsigned long number_of_reads;  // Number of memory reads
  48.     unsigned long number_of_writes; // Number of memory writes
  49.     unsigned long number_of_cycles; // Number of cycles
  50.  
  51.     // Read a word from memory
  52.     int Peek(unsigned long address, unsigned int& value);
  53.  
  54.     // Write a word to memory
  55.     int Poke(unsigned long address, unsigned int value);
  56.  
  57.   public:
  58.     RegisterSet  register_set;      // The register set
  59.     ALU          alu;               // Hector's ALU
  60.     unsigned int ir;                // Instruction Register
  61.     unsigned int mar;               // Memory Address Register
  62.     unsigned int mdr;               // Memory Data Register
  63.  
  64.     DataPath(BasicCPU*);
  65.     ~DataPath();
  66.  
  67.     // Reset the data path's signals
  68.     void ResetSignals();
  69.  
  70.     // Called at the end of each cycle to perform the actual cycle operations.
  71.     //   Returns NULL or a pointer to an error message.
  72.     const char* Clock();
  73.  
  74.     // Return the number of read memory accesses
  75.     inline unsigned long NumberOfReads()
  76.     { return (number_of_reads); }
  77.  
  78.     // Return the number of write memory accesses
  79.     inline unsigned long NumberOfWrites()
  80.     { return (number_of_writes); }
  81.  
  82.     // Return the number of cycles
  83.     inline unsigned long NumberOfCycles()
  84.     { return (number_of_cycles); }
  85.  
  86.     // Clear the statistics (reads, writes, cycles)
  87.     inline void ClearStatistics()
  88.     { number_of_reads=number_of_writes=number_of_cycles=0; }
  89.  
  90.     // Selects a register to be put on the A_BUS
  91.     void a_sel(int reg);
  92.  
  93.     // Selects a register to be put on the B_BUS
  94.     void b_sel(int reg);
  95.  
  96.     // Latch WRT_BUS into A register
  97.     void wrt_a();
  98.  
  99.     // Latch WRT_BUS into B register
  100.     void wrt_b();
  101.  
  102.     // Gate DATA_BUS onto WRT_BUS
  103.     void db_gt();
  104.  
  105.     // Gate ALU BUS onto WRT_BUS
  106.     void alu_gt();
  107.  
  108.     // Select an ALU Function
  109.     void alu_fn(ALUFunction function);
  110.  
  111.     // Select Bus 
  112.     void mdr_sel(DataPathBus bus);
  113.  
  114.     // Latch selected bus contents into MDR
  115.     void mdr_latch();
  116.  
  117.     // Allow MDR to drive the Data Bus
  118.     void mdr_out_en();
  119.  
  120.     // Select Bus
  121.     void mar_sel(DataPathBus bus);
  122.  
  123.     // Latch selected bus contents into MAR
  124.     void mar_latch();
  125.  
  126.     // Allow MAR to drive the Address Bus
  127.     void mar_out_en();
  128.  
  129.     // Latch IR
  130.     void ir_latch();
  131. };
  132. #endif
  133.  
  134.